/*
 * File      : dfs_fs.h
 * This file is part of Device File System in RT-Thread RTOS
 * COPYRIGHT (C) 2004-2012, RT-Thread Development Team
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along
 *  with this program; if not, write to the Free Software Foundation, Inc.,
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Change Logs:
 * Date           Author       Notes
 * 2005-02-22     Bernard      The first version.
 */

#ifndef __DFS_FS_H__
#define __DFS_FS_H__

#include <dfs.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Pre-declaration */
struct dfs_filesystem;
struct dfs_fd;

/* File system operations */
struct dfs_filesystem_ops {
	char* name;
	uint32_t flags;      /* flags for file system operations */

	/* operations for file */
	const struct dfs_file_ops* fops;

	/* mount and unmount file system */
	int (*mount)(struct dfs_filesystem* fs, unsigned long rwflag, const void* data);
	int (*unmount)(struct dfs_filesystem* fs);

	/* make a file system */
	int (*mkfs)(rt_device_t devid);
	int (*statfs)(struct dfs_filesystem* fs, struct statfs* buf);

	int (*unlink)(struct dfs_filesystem* fs, const char* pathname);
	int (*stat)(struct dfs_filesystem* fs, const char* filename, struct stat* buf);
	int (*rename)(struct dfs_filesystem* fs, const char* oldpath, const char* newpath);
};

/* Mounted file system */
struct dfs_filesystem {
	rt_device_t dev_id;     /* Attached device */

	char* path;             /* File system mount point */
	const struct dfs_filesystem_ops* ops; /* Operations for file system type */

	void* data;             /* Specific file system data */
};

/* file system partition table */
struct dfs_partition {
	uint8_t type;        /* file system type */
	off_t  offset;       /* partition start offset */
	size_t size;         /* partition size */
	rt_sem_t lock;
};

/* mount table */
struct dfs_mount_tbl {
	const char*   device_name;
	const char*   path;
	const char*   filesystemtype;
	unsigned long rwflag;
	const void*   data;
};

int dfs_register(const struct dfs_filesystem_ops* ops);
struct dfs_filesystem* dfs_filesystem_lookup(const char* path);
const char* dfs_filesystem_get_mounted_path(struct rt_device* device);

int dfs_filesystem_get_partition(struct dfs_partition* part,
                                 uint8_t*         buf,
                                 uint32_t        pindex);

int dfs_mount(const char* device_name,
              const char* path,
              const char* filesystemtype,
              unsigned long rwflag,
              const void* data);
int dfs_unmount(const char* specialfile);

int dfs_mkfs(const char* fs_name, const char* device_name);
int dfs_statfs(const char* path, struct statfs* buffer);

#ifdef __cplusplus
}
#endif

#endif
